using System;
using System.Collections.Generic;
using System.Text;
using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;
using Castle.ActiveRecord;
using NHibernate.Expression;

namespace EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio
{
    public class RepositorioOrdenDeTrabajo
    {
        public void Agregar(OrdenDeTrabajo o)
        {
            o.Create();
        }

        public OrdenDeTrabajo[] Listar()
        {
            return ActiveRecordBase<OrdenDeTrabajo>.FindAll();
        }

        public void Modificar(OrdenDeTrabajo o)
        {
            o.UpdateAndFlush();
        }

        public void Eliminar(OrdenDeTrabajo o)
        {
            o.DeleteAndFlush();
        }

       
        public OrdenDeTrabajo Obtener(int id)
        {
            OrdenDeTrabajo orden = OrdenDeTrabajo.Find(id);
            DetalleOrdenDeTrabajo dot;
            foreach (OrdenDeTrabajoAuxiliar otAux in orden.OrdenesDeTrabajoAuxiliar)
            {
                foreach (DetalleOrdenDeTrabajoAuxiliar detalle in otAux.Detalle)
                {
                    dot = new DetalleOrdenDeTrabajo();
                    dot.Cantidad = detalle.Cantidad;
                    dot.Fecha = detalle.Fecha;
                    dot.Despachado = detalle.Despachado;
                    dot.Monto = detalle.Monto;
                    dot.OrdenDeTrabajo = orden;
                    dot.Producto = detalle.Producto;
                    dot.Saldo = detalle.Saldo;
                    orden.Detalle.Add(dot);
                }
            }
            return orden;
        }

        public OrdenDeTrabajo[] Listar(EstadoOrdenDeTrabajo e)
        {
            ICriterion[] query = { Expression.Eq("Estado", e) };
            Order[] sort = { Order.Asc("Estado") };
            OrdenDeTrabajo[] ordenes = OrdenDeTrabajo.FindAll(sort, query);
            DetalleOrdenDeTrabajo dot;
            foreach (OrdenDeTrabajo orden in ordenes)
            {
               foreach (OrdenDeTrabajoAuxiliar otAux in orden.OrdenesDeTrabajoAuxiliar)
                {
                    foreach (DetalleOrdenDeTrabajoAuxiliar detalle in otAux.Detalle)
                    {
                        dot = new DetalleOrdenDeTrabajo();
                        dot.Cantidad = detalle.Cantidad;
                        dot.Fecha = detalle.Fecha;
                        dot.Despachado = detalle.Despachado;
                        dot.Monto = detalle.Monto;
                        dot.OrdenDeTrabajo = orden;
                        dot.Producto = detalle.Producto;
                        dot.Saldo = detalle.Saldo;
                        orden.Detalle.Add(dot);
                    }
                }
            }
            return ordenes;

        }

        public OrdenDeTrabajo[] Listar(EstadoOrdenDeTrabajo e,Cliente c)
        {
            ICriterion[] query = { Expression.Eq("Estado", e), Expression.Eq("Cliente", c) };
            Order[] sort = { Order.Asc("Estado") };
            OrdenDeTrabajo[] ordenes = OrdenDeTrabajo.FindAll(sort, query);
            DetalleOrdenDeTrabajo dot;
            foreach (OrdenDeTrabajo orden in ordenes)
            {
                foreach (OrdenDeTrabajoAuxiliar otAux in orden.OrdenesDeTrabajoAuxiliar)
                {
                    foreach (DetalleOrdenDeTrabajoAuxiliar detalle in otAux.Detalle)
                    {
                        dot = new DetalleOrdenDeTrabajo();
                        dot.Cantidad = detalle.Cantidad;
                        dot.Fecha = detalle.Fecha;
                        dot.Despachado = detalle.Despachado;
                        dot.Monto = detalle.Monto;
                        dot.OrdenDeTrabajo = orden;
                        dot.Producto = detalle.Producto;
                        dot.Saldo = detalle.Saldo;
                        orden.Detalle.Add(dot);
                    }
                }
            }
            return ordenes;

        }

        public OrdenDeTrabajo[] Listar(Cliente c)
        {
            ICriterion[] query = {Expression.Eq("Cliente", c) };
            Order[] sort = { Order.Asc("Estado") };
            OrdenDeTrabajo[] ordenes = OrdenDeTrabajo.FindAll(sort, query);
            DetalleOrdenDeTrabajo dot;
            foreach (OrdenDeTrabajo orden in ordenes)
            {
                foreach (OrdenDeTrabajoAuxiliar otAux in orden.OrdenesDeTrabajoAuxiliar)
                {
                    foreach (DetalleOrdenDeTrabajoAuxiliar detalle in otAux.Detalle)
                    {
                        dot = new DetalleOrdenDeTrabajo();
                        dot.Cantidad = detalle.Cantidad;
                        dot.Fecha = detalle.Fecha;
                        dot.Despachado = detalle.Despachado;
                        dot.Monto = detalle.Monto;
                        dot.OrdenDeTrabajo = orden;
                        dot.Producto = detalle.Producto;
                        dot.Saldo = detalle.Saldo;
                        orden.Detalle.Add(dot);
                    }
                }
            }
            return ordenes;

        }

        public OrdenDeTrabajo[] Buscar(int numeroOrdenDeTrabajo)
        {
            ICriterion[] query = { Expression.Eq("NumeroOrdenDeTrabajo", numeroOrdenDeTrabajo) };
            Order[] sort = { Order.Asc("Estado") };
            OrdenDeTrabajo[] ordenes = OrdenDeTrabajo.FindAll(sort, query);
            DetalleOrdenDeTrabajo dot;
            foreach (OrdenDeTrabajo orden in ordenes)
            {
                foreach (OrdenDeTrabajoAuxiliar otAux in orden.OrdenesDeTrabajoAuxiliar)
                {
                    foreach (DetalleOrdenDeTrabajoAuxiliar detalle in otAux.Detalle)
                    {
                        dot = new DetalleOrdenDeTrabajo();
                        dot.Cantidad = detalle.Cantidad;
                        dot.Fecha = detalle.Fecha;
                        dot.Despachado = detalle.Despachado;
                        dot.Monto = detalle.Monto;
                        dot.OrdenDeTrabajo = orden;
                        dot.Producto = detalle.Producto;
                        dot.Saldo = detalle.Saldo;
                        orden.Detalle.Add(dot);
                    }
                }
            }
            return ordenes;

        }

    }

}
